home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac-Source 1994 July
/
Mac-Source_July_1994.iso
/
C and C++
/
Libraries
/
GUSI
/
Examples
/
GUSIPPCTest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-18
|
4KB
|
168 lines
/*********************************************************************
File : GUSI - Grand Unified Socket Interface
File : GUSIPPCTest - Test PPC sockets
Author : Matthias Neeracher <neeri@iis.ethz.ch>
Started : 02Aug92 Language : MPW C
12Aug92 MN
08Sep92 MN Factor out common socket routines
14Oct92 MN Fix NBP type, usage messages
20Jun93 MN New sa_constr
Last : 20Jun93
*********************************************************************/
#include <GUSI.h>
#include <GUSITest.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <Events.h>
#include <TextUtils.h>
extern int GUSIDefaultSpin(spin_msg, long);
sa_constr_ppc Constr = {
PPC_CON_NEWSTYLE+PPC_CON_MATCH_TYPE,
"\p",
{
smRoman,
"\p",
ppcByString,
"\pGUSIPPCTest"
}
};
void Socket(char, char, const char *)
{
sock = socket(AF_PPC, SOCK_STREAM, 0);
if (sock == -1) {
printf("# socket() returned error %s\n", Explain());
Where();
}
}
void Bind(char ch1, char ch2, const char * cmd)
{
struct sockaddr_ppc addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
addr.family = AF_PPC;
addr.port.nameScript = smRoman;
addr.port.portKindSelector = ppcByString;
addr.location.locationKindSelector = ppcNBPTypeLocation;
if (sscanf(cmd, "%P %P", addr.port.name, &addr.location.u.nbpType) != 2) {
Usage(ch1, ch2);
return;
}
strcpy((char *) &addr.port.u.portTypeStr, (char *) "\pGUSIPPCTest");
if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc))) {
printf("bind() returned error %s\n", Explain());
Where();
}
}
void Accept(char, char, const char *)
{
int len;
struct sockaddr_ppc addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
if (accsock != -1) {
printf("# can't accept more than one connection\n");
Where();
return;
}
len = sizeof(struct sockaddr_ppc);
sock = accept(accsock = sock, (struct sockaddr *) &addr, &len);
if (sock < 0) {
printf("# accept() returned error %s\n", Explain());
sock = accsock;
accsock = -1;
} else {
printf(
"# accepted connection from %P[%P]",
addr.port.name,
addr.port.u.portTypeStr);
switch (addr.location.locationKindSelector) {
case ppcNBPLocation:
printf(
"@%P:%P:%P\n",
addr.location.u.nbpEntity.objStr,
addr.location.u.nbpEntity.typeStr,
addr.location.u.nbpEntity.zoneStr);
break;
case ppcNBPTypeLocation:
printf("@%P\n", addr.location.u.nbpType);
break;
default:
printf("\n");
break;
}
}
Where();
}
void Connect(char, char, const char * cmd)
{
int len;
struct sockaddr_ppc addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
len = sizeof(struct sockaddr_ppc);
if (choose(AF_PPC, 0, "Yeah ?", &Constr, 0, &addr, &len)) {
printf("# choose() returned error %s\n", Explain());
Where();
return;
}
if (connect(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc))) {
printf("# connect() returned error %s\n", Explain());
Where();
}
}
main(int argc, char ** argv)
{
printf("GUSIPPCTest MN 20Jun93\n\n");
COMMAND('s', 's', Socket, "", "Create a stream socket");
COMMAND('b', 'd', Bind, "Name Type", "Bind to address");
COMMAND('c', 'o', Connect, "", "Connect to address");
COMMAND('a', 'c', Accept, "", "Accept a connection");
AddSocketCommands();
GUSISetEvents(GUSISIOWEvents);
RunTest(argc, argv);
CleanupSockets();
}